import Axios from 'axios'
import { Message, Loading } from 'element-ui'
import store from '@/store'
import { checkTimeStamp } from './auth'
import router from '@/router'
const service = Axios.create({
  baseURL: process.env.VUE_APP_BASE_API, //设置基地址
  timeout: 5000, //定义5S超时
}) //创建一个axios实例
//请求拦截器
service.interceptors.request.use(
  async config => {
    //在这个位置需要统一的拦截去注入token
    if (store.getters.token) {
      //如果token存在,注入token
      // 判断当前的token是否过期，如果过期了则调用logout登出方法
      if (checkTimeStamp()) {
        await store.dispatch('user/logout')
        router.push({ name: 'login' })
        return Promise.reject(new Error('用户信息失效，请重新登录'))
      }
      config.headers.Authorization = `Bearer ${store.getters.token}`
      //config本质上就是 axios实例中传的那个对象,在返回之前可以随意的进行修改,请求最终拿到的是操作过后的config
    }
    if (config?.doc) {
      const options = {
        lock: true,
        fullscreen: false,
        target: config.doc,
        spinner: 'iconfont el-icon-chiken1',
        text:'鸡哥玩命加载中...'
      }
      config.loading = Loading.service(options)
    }
    return config //必须返回配置，否则会卡住
  },
  error => {
    return Promise.reject(error)
  }
)

//响应拦截器
service.interceptors.response.use(
  response => {
    if (response.config?.loading) response.config.loading.close()
    //axios 默认会加一层data
    const { success, message, data } = response.data
    //如果业务成功，则直接返回数据
    if (success) {
      return data
    } else {
      //如果业务失败，就不能进then了，得进catch
      Message.error(message) //提示错误信息
      return Promise.reject(new Error(message)) //返回业务错误 由于下面请求失败返回的是一个错误对象，所以这里要跟下面相对应
    }
  },
  async error => {
    if (error.config?.loading) error.config.loading?.close()
    if (error.response?.data?.code === 10002) {
      //当错误的响应中的code数据为10002的时候，则代表后端告诉我们token失效了
      await store.dispatch('user/logout') //调用user下的logout方法
      // 再跳转至主页
      router.push({ name: 'login' })
      Message.error('登录信息失效，请重新登录')
    } else {
      Message.error(error.message) //提示错误信息
    }
    return Promise.reject(error) //返回执行错误 让当前的执行链跳出成功，直接进入catch
  }
)
export default service //导出axios实例
